import re
from users.models import User

def jwt_response_payload_handler(token, user=None, request=None):

    # token 就是 JWT生成的token
    # user 就是登陆之后的user 是User的实例对象
    return {
        'token': token,
        'username': user.username,
        'user_id':user.id
    }

"""
产品的需求是：  用户不仅可以通过用户实现登陆，也可以通过手机号实现登陆

问题： 我们的登陆是采用的 JWT，  JWT的认证也是使用系统的认证，先认证成功之后，才会生成token

结合我们的问题和需求：
1.我们需要重写 认证后端
2.我们需要在认证后端中，判断用户输入的是手机号还是用户名

"""

"""
抽取（封装）
0.目的
    解耦

1.原则：
    ① 部分代码实现了一个小功能
    ② 重复性的代码（第二次出现的代码）

2.步骤：
    ① 定义一个方法，将要抽取的代码复制到这个方法中（抽取的代码注释，不要删除）
    ② 复制的代码 ，哪里有问题改哪里，缺少的变量以参数的形式定义
    ③ 验证，验证成功之后，再将抽取的代码删除
"""
from rest_framework.mixins import CreateModelMixin

from django.contrib.auth.backends import ModelBackend

def get_user_by_account(username):
    try:
        if re.match(r'1[3-9]\d{9}', username):
            # 手机号
            user = User.objects.get(mobile=username)
        else:
            # 用户名
            user = User.objects.get(username=username)
    except User.DoesNotExist:
        return None

    return user


class UsernameMobileModelBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):

        user = get_user_by_account(username)

        #  我们需要相应的条件查询 用户信息
        # 2. 查询出用户信息之后，只需要 根据密码验证一下就可以
        if user is not None and user.check_password(password):
            return user
        else:
            return None